#include "Singleton11T.h"
#include <QDebug>

//https://blog.csdn.net/baidu_15952103/article/details/109109110
//引用C++primer的话：C++支持两种模板编译模式包含模式(Inclusion   Model )和分离模式(Separation Model)
//
//1. 包含编译模式
//
//在包含编译模式下，在每个模板被实例化的文件中包含函数模板的定义并且往往把定义放在头文件中像对内联函数所做的那样。
// 注: 将内联函数的声明和定义分散到不同的文件中会出错。
//
//2. 分离编译模式
//
//在分离编译模式下函数模板的声明被放在头文件中, 在模板定义中有一个关键字export, 关键字export
// 告诉编译器在生成被其他文件使用的函数模板实例时可能需要这个模板定义编译器必须保证在生成这些实例时该模板定义是可见的 ,
// 关键字export   不需要出现在头文件的模板声明中, 分离模式使我们能够很好地将函数模板的接口同其实现分开进而组织好程序以便把函数模板的接口放到头文件中而把实现放在文本文件中,
// 但是，并不是所有的编译器都支持分离模式, 即使支持也未必总能支持得很好, 支持分离模式需要更复杂的程序设计环境所以它们不能在所有C++编译器实现中提供。

////初始化成员变量;
//template<class T>
//std::mutex Singleton11T<T>::m_tMtx;
//
//template<class T>
//std::atomic<T *> Singleton11T<T>::m_ptInstance(nullptr);

//私有化构造;
//template<class T>
//Singleton11T<T>::Singleton11T()
//{
//    qDebug() << "C++11T 单例构造";
//}
//
//template<class T>
//Singleton11T<T>::~Singleton11T()
//{
//    qDebug() << "C++11T 单例析构";
//}

//获取实例;
//template<class T>
//T* Singleton11T<T>::GetInstance()
//{
//    //获取内存中存储的值;
//    T *temp = m_ptInstance.load(std::memory_order_relaxed);
//    //获取内存栅栏;
//    std::atomic_thread_fence(std::memory_order_acquire);
//    if (nullptr == temp)
//    {
//        std::lock_guard<std::mutex> lock(m_tMtx);
//        //获取内存中存储的值;
//        T *temp = m_ptInstance.load(std::memory_order_relaxed);
//        if (nullptr == temp)
//        {
//            temp = new T();
//            //释放内存栅格;
//            std::atomic_thread_fence(std::memory_order_release);
//            m_ptInstance.store(temp, std::memory_order_relaxed);
//        }
//    }
//    
//    return temp;
//}

//释放实例;
//template<class T>
//void Singleton11T<T>::Destory()
//{
//    //获取内存中存储的值;
//    T* temp = m_ptInstance.load(std::memory_order_relaxed);
//    //获取内存栅栏;
//    std::atomic_thread_fence(std::memory_order_acquire);
//    if (nullptr != temp)
//    {
//        std::lock_guard<std::mutex> lock(m_tMtx);
//        //获取内存中存储的值;
//        T* temp = m_ptInstance.load(std::memory_order_relaxed);
//        if (nullptr != temp)
//        {
//            delete temp;
//            temp = nullptr;
//            //释放内存栅格;
//            std::atomic_thread_fence(std::memory_order_release);
//            m_ptInstance.store(temp, std::memory_order_relaxed);
//        }
//    }
//}

